/**
 * 
 */
package net.gamasoft.sistemadeinventarios.dao;

import java.sql.ResultSet;
import java.util.ArrayList;

import net.gamasoft.sistemadeinventarios.controller.ConexionBD;
import net.gamasoft.sistemadeinventarios.model.Banco;
import net.gamasoft.sistemadeinventarios.model.Cliente;
import net.gamasoft.sistemadeinventarios.util.DataClientPieChart;

/**
 * @author dpaniagua
 *
 */
public class ClienteDAO {
	/**
	 * Permite guardar un cliente en la base de datos
	 * @param clienteDTO guardado
	 * @return true si se guarda el cliente.
	 * @throws Exception en caso de error al guardar.
	 */
	public boolean guardarCliente(Cliente clienteDTO) throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		
		if (conectado) {
			String sql = "INSERT INTO CLIENTE (nombre, apaterno, amaterno, edad, idBanco) " +
					     "VALUES ('"+clienteDTO.getNombre()+"', " +
					     		 "'"+clienteDTO.getApaterno()+"', " +
					     		 "'"+clienteDTO.getAmaterno()+"', " +
					     		  ""+clienteDTO.getEdad()+", " +
					     		  ""+clienteDTO.getBancoDTO().getIdBanco()+")";
			
			conexionBD.ejecutarSQL(sql);
			
			conexionBD.desconectar();
			return true;
		} else {
			System.err.println("Error al conectarse a la bd");
			return false;
		}
	}
	
	public boolean eliminarCliente(int idCliente) throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		//Si esta conectado
		if (conectado) {
			String sql = "DELETE FROM CLIENTE WHERE idCliente = " + idCliente;
			conexionBD.ejecutarSQL(sql);
			
			conexionBD.desconectar();
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Permite actualizar un cliente seleccionado del grid de clientes.
	 * @param cliente actualizado
	 * @return true si fue exitoso
	 * @throws Exception en caso de error al actualizar el cliente.
	 */
	public boolean actualizarCliente(Cliente cliente) throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		
		if (conectado) {
			String sql = "UPDATE CLIENTE SET nombre = '"+cliente.getNombre()+"', " +
											"apaterno = '"+cliente.getApaterno()+"', " +
											"amaterno = '"+cliente.getAmaterno()+"', " +
											"idBanco = "+cliente.getBancoDTO().getIdBanco()+" " +
						"WHERE idCliente = "+cliente.getIdCliente()+"";
			
			conexionBD.ejecutarSQL(sql);
			conexionBD.desconectar();
			return true;
		} else {
			return false;
		}
	}
	
	/**
	 * Permite consultar la lista de clientes.
	 * @return la lista de clientes
	 * @throws Exception en caso de error al consultar la lista de clientes. 
	 */
	public ArrayList<Cliente> consultarClientes() throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		//Si se hace la conexion.
		if (conectado) {
			//Se crea la lista de clientes.
			ArrayList<Cliente> clientes = new ArrayList<>();
			String sql = "SELECT c.idCliente, c.nombre, c.apaterno, c.amaterno, c.edad, c.idBanco, b.nombre " +
						 "FROM CLIENTE c INNER JOIN BANCO b " +
						 "WHERE c.idBanco = b.idBanco";
			//Los datos de consulta se almacenan en rs.
			ResultSet rs = conexionBD.ejecutarSelect(sql);
			
			//Mientras haya datos existentes en rs.
			while (rs.next()) {
				//Se recupera cada cliente
				Cliente cliente = new Cliente();
				cliente.setIdCliente(rs.getInt("c.idCliente"));
				cliente.setNombre(rs.getString("c.nombre"));
				cliente.setApaterno(rs.getString("c.apaterno"));
				cliente.setAmaterno(rs.getString("c.amaterno"));
				cliente.setEdad(rs.getInt("c.edad"));
				
				Banco banco = new Banco();
				banco.setIdBanco(rs.getInt("c.idBanco"));
				banco.setNombre(rs.getString("b.nombre"));
				
				//se agrega cada cliente a la lista.
				cliente.setBancoDTO(banco);
				clientes.add(cliente);
			}
			
			conexionBD.desconectar();
			return clientes;
		} else {
			System.err.println("Error al conectarse a la bd");
			return null;
		}
	}
	
	/**
	 * Permite consultar la lista de Clientes por un filtro
	 * @param nombre del dato a filtrar
	 * @return lista de clientes
	 * @throws Exception en caso de error al consultar los clientes.
	 */
	public ArrayList<Cliente> consultarClientesLikeNombre(String nombre) throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		//Si se hace la conexion.
		if (conectado) {
			//Se crea la lista de clientes.
			ArrayList<Cliente> clientes = new ArrayList<>();
			String sql = "SELECT c.idCliente, c.nombre, c.apaterno, c.amaterno, c.edad, c.idBanco, b.nombre " +
						 "FROM CLIENTE c INNER JOIN BANCO b " +
						 "WHERE c.idBanco = b.idBanco AND c.nombre like '"+nombre+"%' ";
			//Los datos de consulta se almacenan en rs.
			ResultSet rs = conexionBD.ejecutarSelect(sql);
			
			//Mientras haya datos existentes en rs.
			while (rs.next()) {
				//Se recupera cada cliente
				Cliente cliente = new Cliente();
				cliente.setIdCliente(rs.getInt("c.idCliente"));
				cliente.setNombre(rs.getString("c.nombre"));
				cliente.setApaterno(rs.getString("c.apaterno"));
				cliente.setAmaterno(rs.getString("c.amaterno"));
				cliente.setEdad(rs.getInt("c.edad"));
				
				Banco banco = new Banco();
				banco.setIdBanco(rs.getInt("c.idBanco"));
				banco.setNombre(rs.getString("b.nombre"));
				
				//se agrega cada cliente a la lista.
				cliente.setBancoDTO(banco);
				clientes.add(cliente);
			}
			
			conexionBD.desconectar();
			return clientes;
		} else {
			System.err.println("Error al conectarse a la bd");
			return null;
		}		
	}
	
	/**
	 * Consultar los bancos y la cantidad de clientes existentes.
	 * en esos bancos y los muestra en la grafica de clientes.
	 * @return valores de la grafica
	 * @throws Exception en caso de error al consultar los valores.
	 */
	public ArrayList<DataClientPieChart> consultarClientesByBanco() throws Exception {
		ConexionBD conexionBD = new ConexionBD();
		boolean conectado = conexionBD.conectar();
		//Si esta conectado.
		if (conectado) {
			String sql = "SELECT b.nombre, COUNT(c.idCliente) as cantidad " +
						 "FROM CLIENTE c, BANCO b " +
						 "WHERE c.idBanco = b.idBanco " +
						 "GROUP BY b.nombre";
			
			ArrayList<DataClientPieChart> valoresGrafica = new ArrayList<DataClientPieChart>();
			ResultSet rs = conexionBD.ejecutarSelect(sql);
			//Mientras existan datos en rs.
			while (rs.next()) {
				DataClientPieChart graficaCliente = new DataClientPieChart();
				graficaCliente.setEtiqueta(rs.getString("b.nombre"));
				graficaCliente.setValor(rs.getDouble("cantidad"));
			
				//Se agregan los valores a la grafica.
				valoresGrafica.add(graficaCliente);
			}
			
			conexionBD.desconectar();
			return valoresGrafica;
		} else {
			return null;
		}	
	}
}
